package modelo.persistir;

import java.util.ArrayList;

import modelo.Jugador;
import modelo.Poblacion;
import modelo.centrales.CentralElectrica;
import modelo.centrales.CentralEolica;
import modelo.centrales.CentralMineral;
import modelo.centrales.CentralNuclear;
import modelo.edificios.EdificioComercial;
import modelo.edificios.EdificioIndustrial;
import modelo.edificios.EdificioResidencial;
import modelo.mapa.Mapa;
import modelo.mapa.Ubicacion;
import modelo.servicios.Bomberos;
import modelo.servicios.PozoDeAgua;
import modelo.servicios.RedDeAgua;
import modelo.servicios.RutaPavimentada;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

public class JuegoPersistir {

	public static JsonObject persistir(ArrayList elems) 
	{
		Gson gson = new Gson();
		JsonObject jObject=new JsonObject();
		
		jObject.addProperty("Turnos jugados",(long)elems.get(0));
		jObject.addProperty("Turnos jugados sin aparicion de catastrofes",(int)elems.get(1));
		Jugador jug=(Jugador)elems.get(2);
		jObject.add("Jugador",JugadorPersisitir.persistir(jug.obtenerDatosPersistibles()));
		Poblacion pob=(Poblacion)elems.get(3);
		jObject.add("Poblacion",PoblacionPersisitir.persistir(pob.obtenerDatosPersistibles()));
		ArrayList<CentralEolica> listadoCentralesEolicas=(ArrayList<CentralEolica>) elems.get(4);
	    ArrayList<CentralMineral> listadoCentralesMinerales=(ArrayList<CentralMineral>) elems.get(5);
	    ArrayList<CentralNuclear> listadoCentralesNucleares=(ArrayList<CentralNuclear>) elems.get(6);
	    ArrayList<Bomberos> listadoBomberos=(ArrayList<Bomberos>) elems.get(7);
	    ArrayList<PozoDeAgua> listadoPozosDeAgua=(ArrayList<PozoDeAgua>) elems.get(8);
	    ArrayList<EdificioResidencial> listadoDeEdificiosResidenciales=(ArrayList<EdificioResidencial>) elems.get(9);
	    ArrayList<EdificioIndustrial> listadoDeEdificiosIndustriales=(ArrayList<EdificioIndustrial>) elems.get(10);
	    ArrayList<EdificioComercial> listadoDeEdificiosComerciales=(ArrayList<EdificioComercial>) elems.get(11);
	    ArrayList<RedDeAgua> listadoTuberias=(ArrayList<RedDeAgua>) elems.get(12);
        ArrayList<RutaPavimentada> listadoDeRutasPavimentadas=(ArrayList<RutaPavimentada>) elems.get(13);
        jObject.add("Centrales Eolicas",CentralPersistir.persistirArray(listadoCentralesEolicas));
	    jObject.add("Centrales Minerales",CentralPersistir.persistirArray(listadoCentralesMinerales));
	    jObject.add("Centrales Nucleares",CentralPersistir.persistirArray(listadoCentralesNucleares));
	    jObject.add("Bomberos",BomberosPersistir.persistirArray(listadoBomberos));
	    jObject.add("Pozos de Agua",PozoPersistir.persistirArray(listadoPozosDeAgua));
	    jObject.add("Edificios Residenciales",EdificioPersitir.persistirArray(listadoDeEdificiosResidenciales));
	    jObject.add("Edificios Industriales",EdificioPersitir.persistirArray(listadoDeEdificiosIndustriales));
	    jObject.add("Edificios Comeciales",EdificioPersitir.persistirArray(listadoDeEdificiosComerciales));
	    jObject.add("Rutas",RutaPersistir.persistirArray(listadoDeRutasPavimentadas));	
	    Mapa mapa=(Mapa) elems.get(16);
	    jObject.add("Mapa",MapaPersistir.persistir(mapa.obtenerDatosPersistibles()));
		return jObject;
	}

	public static ArrayList cargar(String comp) {
		ArrayList lista=new ArrayList();
		JsonParser parser = new JsonParser();
		JsonObject carg = parser.parse(comp).getAsJsonObject();	
		String map=carg.get("Mapa").toString();
		Mapa.poblarS(MapaPersistir.cargar(map));
		lista.add(carg.get("Turnos jugados").getAsLong());
		lista.add(carg.get("Turnos jugados sin aparicion de catastrofes").getAsInt());
		Jugador jug=new Jugador(null);
		jug.poblar(JugadorPersisitir.cargar(carg.get("Jugador").toString()));
		lista.add(jug);
		Poblacion pob=Poblacion.getInstance();
		pob.poblar(PoblacionPersisitir.cargar(carg.get("Poblacion").toString()));
		lista.add(pob);
		lista.add(JuegoPersistir.cargarArrayCentralesEolicas(carg.get("Centrales Eolicas").toString()));
		lista.add(JuegoPersistir.cargarArrayCentralesMinerales(carg.get("Centrales Minerales").toString()));
		lista.add(JuegoPersistir.cargarArrayCentralesNuclear(carg.get("Centrales Nucleares").toString()));
		lista.add(JuegoPersistir.cargarArrayBomberos(carg.get("Bomberos").toString()));		
		lista.add(JuegoPersistir.cargarArrayPozoDeAgua(carg.get("Pozos de Agua").toString()));
		lista.add(JuegoPersistir.cargarArrayEdificiosResidenciales(carg.get("Edificios Residenciales").toString()));
		lista.add(JuegoPersistir.cargarArrayEdificiosIndustriales(carg.get("Edificios Industriales").toString()));
		lista.add(JuegoPersistir.cargarArrayEdificiosComerciales(carg.get("Edificios Comeciales").toString()));
		lista.add(JuegoPersistir.cargarArrayRutas(carg.get("Rutas").toString()));
		lista.add(Mapa.poblarS(MapaPersistir.cargar(map)));
		return lista;
	}

	private static ArrayList cargarArrayRutas(String comp) {
		ArrayList lista=new ArrayList();
		JsonParser parser = new JsonParser();
		JsonArray jArray=parser.parse(comp).getAsJsonArray();
		for(int i=0;i<jArray.size();i++){
			RutaPavimentada cent=new RutaPavimentada();
			cent.poblar(RutaPersistir.cargar(jArray.get(i).toString()));
			lista.add(cent);
		}
		return lista;
	}

	private static ArrayList cargarArrayCentralesEolicas(String comp) {
		ArrayList lista=new ArrayList();
		JsonParser parser = new JsonParser();
		JsonArray jArray=parser.parse(comp).getAsJsonArray();
		for(int i=0;i<jArray.size();i++){
			CentralEolica cent=new CentralEolica(new Ubicacion(0,0));
			cent.poblar(CentralPersistir.cargar(jArray.get(i).toString()));
			lista.add(cent);
		}
		return lista;
	}
	private static ArrayList cargarArrayCentralesMinerales(String comp) {
		ArrayList lista=new ArrayList();
		JsonParser parser = new JsonParser();
		JsonArray jArray=parser.parse(comp).getAsJsonArray();
		for(int i=0;i<jArray.size();i++){
			CentralMineral cent=new CentralMineral(new Ubicacion(0,0));
			cent.poblar(CentralPersistir.cargar(jArray.get(i).toString()));
			lista.add(cent);
		}
		return lista;
	}
	private static ArrayList cargarArrayCentralesNuclear(String comp) {
		ArrayList lista=new ArrayList();
		JsonParser parser = new JsonParser();
		JsonArray jArray=parser.parse(comp).getAsJsonArray();
		for(int i=0;i<jArray.size();i++){
			CentralNuclear cent=new CentralNuclear(new Ubicacion(0,0));
			cent.poblar(CentralPersistir.cargar(jArray.get(i).toString()));
			lista.add(cent);
		}
		return lista;
	}
	private static ArrayList cargarArrayBomberos(String comp) {
		ArrayList lista=new ArrayList();
		JsonParser parser = new JsonParser();
		JsonArray jArray=parser.parse(comp).getAsJsonArray();
		for(int i=0;i<jArray.size();i++){
			Bomberos cent=new Bomberos(new Ubicacion(0,0));
			cent.poblar(BomberosPersistir.cargar(jArray.get(i).toString()));
			lista.add(cent);
		}
		return lista;
	}
	private static ArrayList cargarArrayPozoDeAgua(String comp) {
		ArrayList lista=new ArrayList();
		JsonParser parser = new JsonParser();
		JsonArray jArray=parser.parse(comp).getAsJsonArray();
		for(int i=0;i<jArray.size();i++){
			PozoDeAgua cent=new PozoDeAgua();
			cent.poblar(PozoPersistir.cargar(jArray.get(i).toString()));
			lista.add(cent);
		}
		return lista;
	}
	private static ArrayList cargarArrayEdificiosResidenciales(String comp) {
		ArrayList lista=new ArrayList();
		JsonParser parser = new JsonParser();
		JsonArray jArray=parser.parse(comp).getAsJsonArray();
		for(int i=0;i<jArray.size();i++){
			EdificioResidencial cent=new EdificioResidencial();
			cent.poblar(EdificioPersitir.cargar(jArray.get(i).toString()));
			lista.add(cent);
		}
		return lista;
	}
	private static ArrayList cargarArrayEdificiosComerciales(String comp) {
		ArrayList lista=new ArrayList();
		JsonParser parser = new JsonParser();
		JsonArray jArray=parser.parse(comp).getAsJsonArray();
		for(int i=0;i<jArray.size();i++){
			EdificioComercial cent=new EdificioComercial();
			cent.poblar(EdificioPersitir.cargar(jArray.get(i).toString()));
			lista.add(cent);
		}
		return lista;
	}
	private static ArrayList cargarArrayEdificiosIndustriales(String comp) {
		ArrayList lista=new ArrayList();
		JsonParser parser = new JsonParser();
		JsonArray jArray=parser.parse(comp).getAsJsonArray();
		for(int i=0;i<jArray.size();i++){
			EdificioIndustrial cent=new EdificioIndustrial();
			cent.poblar(EdificioPersitir.cargar(jArray.get(i).toString()));
			lista.add(cent);
		}
		return lista;
	}
}
